#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 玉米田的升级版，由于每次在摆放第i行的时候都需要受第i - 1行和第 i - 2行的影响，所以状态表示时需要增加一个维度
// f[i][j][k]表示当前已经摆到第i行，并且第i行的摆放状态是k, 第i - 1行的摆放状态是j所能摆放炮兵的最大数量

const int M = 1 << 10, N = 110;
// 内存太大，要用滚动数组优化
int f[2][M][M];
// status存放的是当前合法的状态
vector<int> status;
// cnt数组存放对应状态下的炮兵数量
vector<int> cnt;
int n, m;
// g中存放的是每一行不能放的山地
int g[N];

// check函数判断是否有相邻的两个1
bool check(int u)
{
    for (int i = 0; i < n; ++i)
        if (((u >> i) & 1) && (((u >> (i + 1)) & 1) || (u >> (i + 2)) & 1))
            return false;
    return true;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 0; j < m; ++j)
        {
            char c;
            cin >> c;
            if (c == 'H')
                g[i] += 1 << j;
        }
    // 预处理所有合法的状态
    for (int i = 0; i < 1 << m; ++i)
        if (check(i))
        {
            status.push_back(i);
            int tmp = i, num = 0;
            while (tmp)
            {
                ++num;
                tmp &= (tmp - 1);
            }
            cnt.push_back(num);
        }

    // 枚举所有第i和i - 1行的状态，找到所有合法的第i - 2 行的状态，进行状态转移
    for (int i = 1; i <= n; ++i)
        for (int j = 0; j < status.size(); ++j)
            for (int k = 0; k < status.size(); ++k)
            {
                int a = status[j], b = status[k];
                // 如果当前状态下有炮台放在山地，那就不是正确状态，直接跳过
                if ((g[i] & b) | (g[i - 1] & a))
                    continue;
                if (a & b)
                    continue;
                // 遍历寻找满足条件的第i - 2行的状态
                for (int u = 0; u < status.size(); ++u)
                {
                    int c = status[u];
                    if ((a & c) | (b & c))
                        continue;
                    // 找到合法状态，更新炮台数
                    f[i & 1][a][b] = max(f[i & 1][a][b], f[i - 1 & 1][c][a] + cnt[k]);
                }
            }
    int res = 0;
    for (auto i : status)
        for (auto j : status)
            res = max(res, f[n & 1][i][j]);

    cout << res << endl;
    return 0;
}